//
//  ViewController.m
//  NSURLSession
//
//  Created by apple on 15/9/6.
//  Copyright (c) 2015年 戴维营. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()<NSURLSessionDataDelegate>

{
//    首先定义实例变量
    
    NSURLSession *_session;
    NSURLSessionDataTask *_task;
    NSString *_filePath;
    NSMutableData *_buf;
    
    NSInteger _totalNumber;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _buf = [NSMutableData data];
    
//    NSURLSession作为NSURLConnection的继承者，为每个会话的缓存，Cookie和证书的设置提供了支持。每一个NSURLSessiob都根据NSURLSessionConfiguration进行初始化。
    
//    1⃣️、NSURLSessionTask对象需要通过NSURLSession创建。
    
//    2⃣️、NSURLSessionDataTask完成后，task对象拥有关联的服务器响应数据。
    
//    3⃣️、NSURLSessionDownloadTask完成后，task对象拥有已经下载的文件的临时路径。
    
//    4⃣️、NSURLSessionUploadTask用于上传文件。
  
//----------------------------------------------------------------
    
//#if 0
////    NSURLConnection
//    
//    NSURL *url = [NSURL URLWithString:@"http://h.hiphotos.bdimg.com/album/s%3D1400%3Bq%3D90/sign=f8e46b6571cf3bc7ec00c9e8e13081d0/730e0cf3d7ca7bcb95ab5047bf096b63f724a882.jpg"];
//    NSURLRequest *request = [NSURLRequest requestWithURL:url];
//    
//    [NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
//        if (connectionError == nil)
//        {
//            [data writeToFile:@"/Users/apple/Desktop/123.jpg" atomically:YES];
//            NSLog(@"下载成功");
//        }
//        else
//        {
//            NSLog(@"下载失败");
//        }
//    }];
//    
//#endif
//    
//#if 0
////    NSURLSession
//
//    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://h.hiphotos.bdimg.com/album/s%3D1400%3Bq%3D90/sign=f8e46b6571cf3bc7ec00c9e8e13081d0/730e0cf3d7ca7bcb95ab5047bf096b63f724a882.jpg" ]];
//  
////    获取session对象，单例类；
//    NSURLSession *session = [NSURLSession sharedSession];
//    
////    获取dataTask对象
//      NSURLSessionTask *task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
//    {
//        if (error == nil)
//        {
////            如果是图片的话可以考虑用UIImageView显示；
//            [data writeToFile:@"/Users/apple/Desktop/abc.jpg" atomically:YES];
//            NSLog(@"下载完成");
//        }
//        else
//        {
//            NSLog(@"下载失败");
//        }
//    }];
//    
//    [task resume];//开始下载；
//    
//    
//#endif
    
//    
//#if 0
//
////创建session对象；
//    NSURLSession *session = [NSURLSession sharedSession];
//    
////    创建下载任务对象；
//    
//    NSURLSessionDownloadTask *task = [session downloadTaskWithURL:[NSURL URLWithString:@"http://h.hiphotos.bdimg.com/album/s%3D1400%3Bq%3D90/sign=f8e46b6571cf3bc7ec00c9e8e13081d0/730e0cf3d7ca7bcb95ab5047bf096b63f724a882.jpg"] completionHandler:^(NSURL *location, NSURLResponse *response, NSError *error)
//    {
//        if (error == nil)
//        {
////            下载的文件临时路径为location，可以将它移动合适的位置；
//            NSData *data = [NSData dataWithContentsOfURL:location];
//            
//            [data writeToFile:@"/Users/apple/Desktop/1234.jpg" atomically:YES];
//            NSLog(@"下载成功");
//        }
//        else
//        {
//            NSLog(@"下载失败");
//        }
//    }];
//    
//    [task resume];
//    
//    
//#endif

#if 1
    
//    NSURLSessionDataTask
    
    _filePath = @"http://link.hhtjim.com/163/33162226.mp3";
    
//    创建一个临时的session配置［没有本地缓存，数据都在内存当中］；
    NSURLSessionConfiguration *config = [NSURLSessionConfiguration ephemeralSessionConfiguration];
    
//    使用上面创建的session配置创建一个session对象；
    
    _session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
    
//    调用方法请求数据［返回一个NSURLSessionTask对象，该对象后面会用到，比如开始和暂停等操作，］

//  挂上NSURLSessionDataDelegate协议
    
    _task = [_session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:_filePath]]];
    
    
    
    
    
#endif
    // Do any additional setup after loading the view, typically from a nib.
}

#pragma mark - 下载
- (IBAction)download:(UIButton *)sender
{
    //若当前的task状态为挂起，则点击下载按钮时开始运行任务－－》task创建默认为挂起状态；
    if (_task.state == NSURLSessionTaskStateSuspended)
    {
        [_task resume];
    }
    
//    若task为完成状态［之前的任务处理完成了］，此时点击下载按钮，重新创建task对象；
    
//    完成状态的task就算再次运行，代理方法也不会再调用，因此需要重新创建task对象；
    
    if (_task.state == NSURLSessionTaskStateCompleted)
    {
        _task = [_session dataTaskWithRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:_filePath]]];
        
        [_task resume];
    }
    
}


#pragma mark - 暂停
- (IBAction)pause:(UIButton *)sender
{
//    判断当前的task状态，若正在运行，则触发暂停按钮是调用suspend方法，挂起任务，
    
    if (_task.state == NSURLSessionTaskStateRunning)
    {
        [_task suspend];//------>
    }
    
}

//开始接受响应［状态参照NSURLConnection的代理方法］
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition))completionHandler
{
    NSLog(@"response->%lld",response.expectedContentLength);
    _totalNumber = response.expectedContentLength;
    
//    若响应成功，此时我们需要调用block方法，并传入枚举值NSURLSessionResponseAllow，意为准许继续下载［］继续调用下面的代理方法；
    
    NSHTTPURLResponse *tmpresponse = (NSHTTPURLResponse *)response;
    
    if (tmpresponse.statusCode == 200)
    {
        completionHandler(NSURLSessionResponseAllow);
    }
}

//开始持续调用该方法接受数据

- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
{
//    NSLog(@"data-->%ld",[data length]);
    
    [_buf appendData:data];
    
    NSLog(@"%.2f%%",_buf.length * 100.0 / _totalNumber);
}

//接受数据完成，也可能是失败了，因此我们需要判断究竟是完成了还是失败了；
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
{
    NSLog(@"error-->%@",[error localizedDescription]);
    
//    调用下面这个方法关闭session，但是注意，若关闭 session了，下次再次请求任务时需要重新创建session对象；
    
//    [_session finishTasksAndInvalidate];
    
    if (!error)
    {
        [_buf writeToFile:@"/Users/apple/Desktop/acd.mp3" atomically:YES];
        [_buf setData:nil];
    }

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end
